賦值差異
在 primitive type 中,變數 a 並不會跟著一起改變
1
2
3
4
5var a = 10;
var b = a;
console.log(a, b) // 10, 10;
b = 200;
console.log(a, b) // 10, 200;
在 object 中,obj 也連同 obj2 一起改變
1
2
3
4
5
6
7var obj = {
number: 10;
}
var obj2 = obj;
console.log(obj, obj2) // {number: 10} {number: 10};
obj2.number = 20;
console.log(obj, obj2) // {number: 20} {number: 20};
原理
在 primitive type 中
1
2
3
4
5var a = 10;
var b = a;
console.log(a, b); // 10, 10
b = 200;
console.log(a, b); // 10, 200可以由儲存的記憶體位置來試想,當我們宣告
var a = 10
時,1
a: 10; // 記憶體 a 位置,儲存的值 = 10
當我們宣告
var b = a
時,會把 a 的值複製給 b ,所以 b 的記憶體位置也會存 10 。1
2a: 10
b: 10當我們下指令
b = 20
時,此時就將 b 位置的值修改成 20。1
2a: 10
b: 20在 object 中
1
2
3
4
5
6
7
8var obj = {
number: 10;
}
var obj2 = obj;
console.log(obj, obj2) // {number: 10} {number: 10};
obj2.number = 20;
console.log(obj, obj2) // {number: 20} {number: 20};當我們宣告 obj 時,會將 obj 真正的值儲存在某記憶體位置,
1
2
3var obj = {
number: 10;
}可試想儲存在記憶體 0x01 的位置,
1
2
30x01 {
number: 10;
}此時回頭看 obj 儲存的值其實是這個記憶體位置,
1
obj: 0x01
因此當我們宣告
var obj2 = obj
時,會將 obj 的值,也就是記憶體位置複製給 obj2,所以現在obj
與obj2
會指向同一個記憶體位置。1
2
3
4
5
60x01 {
number: 10;
}
obj: 0x01
obj2: 0x01最後當我們執行
obj2.number = 20
來改變 obj2 的值的時候,會去找 obj2 的記憶體位置的 number 修改成 20,所以 obj 和 obj2 log 出來的值就會變成相同。1
2
3
4
5
60x01: {
number: 20;
}
obj: 0x01
obj2: 0x01若再將例子變換一些,
1
2
3
4
5
6
7
8
9
10var obj = {
number: 10;
}
var obj2 = obj;
console.log(obj, obj2); // {number: 10} {number: 10}
obj2 = {
number: 30;
}
console.log(obj, obj2); // {number: 10} {number: 30}在
var obj = { number: 10 }
時,會先建立新的記憶體位置 0x01,再把記憶體位置給予 obj,而 obj2 同上,也會建立另一個新的記憶體位置 0x02,再將記憶體位置給予 obj2。1
2
3
4
5
6
7
8
9
100x01: {
number: 10;
}
0x02: {
number: 30;
}
obj: 0x01
obj2: 0x02
Comments